home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / GL / flight / message.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  11KB  |  376 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17.  
  18. /*
  19.  *  flight/message.c $Revision: 1.2 $
  20.  */
  21.  
  22. #include "flight.h"
  23.  
  24.  
  25. /*
  26.  *  Messages
  27.  */
  28. #define XXXHEADER(vnum)\
  29. "                      SGI Flight Simulator Version vnum"
  30. #define HEADER(vnum)\
  31. "                      SGI Flight Simulator Version 3.4"
  32.  
  33.  
  34. static char *helpmsg[] = {
  35. HEADER(VERSION_NUMBER),
  36. "The mouse  controls the white square on the screen which represents the control",
  37. "stick of the plane.  Moving  the  mouse  to  the right causes the plane to roll",
  38. "to the right.  Note that the plane continues to roll until you return the stick",
  39. "to the  center (the bottom center of the windshield).  To takeoff,  use maximum",
  40. "thrust and  pull  back on the stick once you are going fast enough.  The  mouse",
  41. "buttons control the rudder.  Each press of the left mouse button increases left",
  42. "rudder, likewise for the right button.  The  middle  button  returns the rudder",
  43. "to the middle position.  The  rudder  position is indicated by the red triangle",
  44. "at the bottom of the horizon meter.  Try to land with less than 600 fpm descent",
  45. "and 10 degrees roll.  The better the landing, the more  fuel  and  weapons  you",
  46. "receive.  Press any character to continue.  Good luck!",
  47. " ",
  48. "                 ------  Keyboard commands  ------",
  49. "    t   - track/lock on a target      x/z - zoom in/out (tower view)",
  50. "    n/N - time of day +5/-5 minutes   a/s - decrease/increase thrust",
  51. "    Q   - Missile view toggle         H   - Toggle heads-up display",
  52. "    d   - Tower/plane view toggle     f/F - increase/decrease flaps",
  53. "    W   - Wingman view toggle         c/C - increase/decrease spoilers",
  54. "    l   - toggle landing gear         r/R - detonate/restart game (also 'u')",
  55. "    v   - autopilot                   q/w - fire a rocket/sidewinder",
  56. "    e   - fire a cannon burst         h   - display help",
  57. "    F1  - toggle fog                  F2  - toggle texture",
  58. "    m/M - increase/decrease fog       ESC - quit",
  59. ""
  60. };
  61.  
  62.  
  63. #define XXXSHADOW_HEADER(vnum)\
  64. "          SGI Flight Simulator Shadower Version vnum"
  65. #define SHADOW_HEADER(vnum)\
  66. "          SGI Flight Simulator Shadower Version 3.4"
  67.  
  68.  
  69. static char *shadow_helpmsg[] = {
  70. SHADOW_HEADER(VERSION_NUMBER),
  71. " ",
  72. "This program shadows another plane that is playing  dogfight.  You  cannot",
  73. "control  the  plane,  you  can only control your view from the plane.  The",
  74. "left and right  arrow  keys  rotate  your  head  90 degrees left and right",
  75. "when viewing from the plane, check the upper left of the screen for status",
  76. "Press any character to continue",
  77. " ",
  78. "                     Keyboard commands",
  79. "                     -------- --------",
  80. "  t  - track next plane           n/N - time of day +5/-5 minutes",
  81. "  d  - toggle tower/plane view    x   - zoom in (tower view)",
  82. "  W  - toggle wingmans view       z   - zoom out (tower view)",
  83. "  r  - restart the game           h   - display help",
  84. "  F1 - toggle fog                 F2  - toggle texture",
  85. "  m  - increase/decrease fog      ESC - quit",
  86. ""
  87. };
  88.  
  89.  
  90. #define XXXHEADER(vnum)\
  91. "                          SGI Radar Version vnum"
  92. #define RADAR_HEADER(vnum)\
  93. "                          SGI Radar Version 3.4"
  94.  
  95. static char *radar_helpmsg[] = {
  96. RADAR_HEADER(VERSION_NUMBER),
  97. " ",
  98. "The radar screen displays the world and planes looking down from the above.",
  99. "Each plane is displayed in a different color with a 16 second history shown",
  100. "with dots and an 8 second projected trajectory shown with a line. The first",
  101. "line of text is the person's name, the second line contains the plane type,",
  102. "its air speed in knots, the sign of its rate of climb,  and its altitude in",
  103. "hundreds of feet.  Sidewinders are red, rockets are orange, and cannons are",
  104. "yellow.  Press ESC to close this window.",
  105. " ",
  106. "                     Keyboard commands",
  107. "                     -------- --------",
  108. "  h   - display help              x/z - zoom in/out",
  109. "  ESC - quit",
  110. "  left   mouse button - send message to closest plane",
  111. "  middle mouse button - broadcast message to everyone",
  112. "  right  mouse button - drag radar screen around",
  113. "  arrow keys - move one grid square in the direction of arrow",
  114. ""
  115. };
  116.  
  117.  
  118. static char *waitmsg[] = {
  119. " ",
  120. " ",
  121. " ",
  122. " ",
  123. " ",
  124. " ",
  125. " ",
  126. " ",
  127. " ",
  128. " ",
  129. " ",
  130. " ",
  131. " ",
  132. "Initializing Data",
  133. ""
  134. };
  135.  
  136.  
  137. static char *plane_menu[] = {
  138. "                      Choose a plane from the following list",
  139. "                        by typing the number of the plane",
  140. " ",
  141. "                        Weight(lbs)     Max        Wing     Loading   Takeoff",
  142. "    #     Type        body      fuel   Thrust   area  span  max  min   speed",
  143. "    -   ----------   -------  -------  -------  ----  ----  ---  ---  -------",
  144. "    1   Cessna 150     1,000      400      250   157    28  +5g  -3g     55",
  145. "    2   Boeing 747   500,000  100,000  200,000  5500   220  +4g  -2g    148",
  146. "    3   F-15          28,000   14,000   46,000   608    42  +8g  -5g    112",
  147. "    4   F-16          18,000    8,000   23,000   390    32 +10g  -7g    122",
  148. "    5   F-18          24,000   12,000   32,000   510    38  +9g  -6g    116",
  149. "    6   P-38          13,500    1,600    4,000   327    52  +6g  -3.5g   75",
  150. "    7   F-14D         42,000   16,200   55,000   565    64  +8g  -4g    115",
  151. "    8   Boeing 727   101,773   59,750   48,000  1700   108  +4g  -2g    140",
  152. #if 0
  153. "    9   F-117A        30,000   14,000   25,000   900    38  +8g  -6g    120",
  154. #endif
  155. " ",
  156. "                                 Additional Help",
  157. "The left and right arrow keys rotate  your head left and right when viewing",
  158. "from the plane, check the upper left of the screen for how much.  Only one weapon can be",
  159. "in play at a time.  To prematurely detonate a rocket or sidewinder, use restart ('r').",
  160. "Cannon shots last one second.  Sidewinders  track planes (except the C-150) within the",
  161. "target window that are higher than 150 feet.  The track command identifies the closest",
  162. "target and locks on to it for one second.  Sidewinders are guaranteed to track  locked",
  163. "targets.  Flaps increase lift and angle of attack but decrease the  stall  angle.  The",
  164. "spoilers  substantially  increase drag and decrease lift.  To land, first slow down to",
  165. "just over the stall speed.  Then use full flaps and don't forget your landing gear!",
  166. ""
  167. };
  168.  
  169.  
  170. void display_help()
  171. {
  172.     display_message_no_wait(helpmsg, 0);
  173. }
  174.  
  175.  
  176. void overlay_help()
  177. {
  178.     display_message_no_wait(helpmsg, 1);
  179. }
  180.  
  181.  
  182. void display_shadow_help()
  183. {
  184.     display_message_no_wait(shadow_helpmsg, 0);
  185. }
  186.  
  187.  
  188. void overlay_shadow_help()
  189. {
  190.     display_message_no_wait(shadow_helpmsg, 1);
  191. }
  192.  
  193.  
  194. void display_radar_help()
  195. {
  196.     display_message_no_wait(radar_helpmsg, 0);
  197. }
  198.  
  199.  
  200. void overlay_radar_help()
  201. {
  202.     display_message_no_wait(radar_helpmsg, 1);
  203. }
  204.  
  205.  
  206. void display_wait()
  207. {
  208.     display_message_no_wait(waitmsg, 0);
  209. }
  210.  
  211.  
  212. int pick_plane()
  213. {
  214.     register int i;
  215.  
  216.     display_message_no_wait(plane_menu, 0);
  217.     read_objects(TRUE);
  218.  
  219.     i = wait_for_input();
  220.     if (i > 0) return(i - '0');
  221.     i = -i;
  222.     if (i == PAD1) return(1);
  223.     else if (i == PAD2) return(2);
  224.     else if (i == PAD3) return(3);
  225.     else if (i == PAD4) return(4);
  226.     else if (i == PAD5) return(5);
  227. }
  228.  
  229.  
  230. void display_score()
  231. {
  232.     register char *plane_name, **msg;
  233.     register int i;
  234.     register Plane p, *pp;
  235.     static char *score_msg[MAX_PLANES+6];
  236.  
  237.     /*
  238.      *  init the array first
  239.      */
  240.     if (score_msg[0] == NULL)
  241.     {
  242.     msg = score_msg;
  243.     *msg++ = "               Score Board";
  244.     *msg++ = " ";
  245.     *msg++ = "            Name Plane  Won Lost  Score";
  246.     *msg++ = "---------------- -----  --- ----  -----";
  247.     for (i=0; i < MAX_PLANES+2; i++)
  248.         *msg++ = (char *) malloc(strlen(score_msg[2])+1);
  249.     };
  250.  
  251.     msg = &score_msg[4];
  252.     FOR_EACH_PLANE (p, pp)
  253.     {
  254.     switch(p->type)
  255.     {
  256.         case C150:
  257.         plane_name = C150_NAME;
  258.         break;
  259.         case B747:
  260.         plane_name = B747_NAME;
  261.         break;
  262.         case F15:
  263.         plane_name = F15_NAME;
  264.         break;
  265.         case F16:
  266.         plane_name = F16_NAME;
  267.         break;
  268.         case F18:
  269.         plane_name = F18_NAME;
  270.         break;
  271.         case P38:
  272.         plane_name = P38_NAME;
  273.         break;
  274.         case F14:
  275.         plane_name = F14_NAME;
  276.         break;
  277.         case B727:
  278.         plane_name = B727_NAME;
  279.         break;
  280.         default:
  281.         plane_name = "UNKNOWN";
  282.         break;
  283.     }
  284.     sprintf(*msg++, "%16s %5s  %3d %4d  %5d",
  285.         p->myname, plane_name,
  286.         p->won, p->lost, p->won - p->lost);
  287.     }
  288.     sprintf(*msg++, " ");
  289.     sprintf(*msg++, "Press any character to continue.");
  290.     **msg = '\0';
  291.     display_message(score_msg);
  292. }
  293.  
  294.  
  295. /*
  296.  *  wait for a key to be hit and return it
  297.  */
  298. int wait_for_input()
  299. {
  300.     short type, val;
  301.  
  302.     while ((type = qread(&val)) != KEYBD)    /* wait for character    */
  303.     if (type == REDRAW)
  304.         redraw_screen();
  305.  
  306.     return(val);
  307. }
  308.  
  309.  
  310. /*
  311.  *  display a message and wait for input before returning
  312.  */
  313. int display_message(char **msg)
  314. {
  315.     display_message_no_wait(msg, 0);
  316.     return(wait_for_input());
  317. }
  318.  
  319.  
  320. /*
  321.  *  display a message but dont wait for input'
  322.  */
  323. void display_message_no_wait(char **msg, int transparent)
  324. {
  325.     float y;
  326.     int lines;
  327.     float delta;
  328.     int w, mw;
  329.     char **tmp;
  330.  
  331.     if (hud || shadow || radar)
  332.     {
  333.     viewport(0, xmaxwindow, 0, ymaxwindow);
  334.     ortho2(-200.0, 200.0, -150.0, 150.0);
  335.     ortho2(-0.5, xmaxwindow+0.5, -150.0, 150.0);
  336.     }
  337.     else
  338.     {
  339.     viewport(1, xmaxwindow-1, ymiddle, ymaxwindow-1);
  340.     ortho2(-200.0, 200.0, -100.0, 100.0);
  341.     ortho2(-0.5, xmaxwindow+0.5, -100.0, 100.0);
  342.     }
  343.  
  344.     tmp = msg;
  345.     mw = 0;
  346.     lines = 0;
  347.     while (**tmp)
  348.     {
  349.     w = strwidth(*tmp++);
  350.     if (w > mw)
  351.         mw = w;
  352.     lines++;
  353.     }
  354.     w = mw >> 1;
  355.  
  356.     delta = MIN((190.0/lines), 8.0);
  357.  
  358.     if (!transparent)
  359.     {
  360.     COLOR(C_BLUE);
  361.     clear();
  362.     }
  363.  
  364.     y = 90;
  365.     COLOR(C_WHITE);
  366.     while (**msg)            /* display help in white    */
  367.     {
  368.     cmov2((float)(xmiddle-w), y);
  369.     charstr(*msg++);
  370.     y -= delta;
  371.     }
  372.  
  373.     if (!transparent)
  374.     swapbuffers();
  375. }
  376.